package com.shiliuzi.www.controller;

import com.aliyuncs.exceptions.ClientException;
import com.shiliuzi.www.pojo.dto.revoke.*;
import com.shiliuzi.www.pojo.po.Cancel;
import com.shiliuzi.www.common.Result;
import com.shiliuzi.www.service.RevokeService;

import com.shiliuzi.www.util.powerUtil.Power;
import org.springframework.stereotype.Controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.List;

//@Controller
@RestController
@RequestMapping("/Revoke")
@CrossOrigin
public class RevokeController {

    @Resource
    private RevokeService revokeService;
      /**
       * 查询奖惩记录
       * @return
       * @author liuyixin
       */
      //TODO 参数名字，支持分页查询，支持模糊查询---角色区分
      @PostMapping("/getRevoke")
      public Result getRevokeInfo(@RequestBody RevokeShowDto revokeShowDto) {
          return revokeService.selRecord(revokeShowDto);
      }

    /**
     * 管理员查询撤销记录
     * 记录方式：
     *      1、传入数据中存有静态数据
     *      2、由redis进行存储
     * @return
     * @author guojunji
     */
    //TODO 优化
    @Power(powId = 9)
    @PostMapping("/record")
    public Result getCancelRecord(@Validated @RequestBody CancelRecordGetDto cancelRecordGetDto) {
        return revokeService.obtainCancelRecord(cancelRecordGetDto);
    }

    /**
     * 管理员填写撤销记录表
     *
     * @return
     * @author liuyixin
     */
    //TODO 参数名字
    @PostMapping("/setCancelRecord")
    public Result setCancelRecord(@RequestBody Cancel cancel) {
        return revokeService.cancelRecord(cancel);
    }

    /**
     * 成员申诉奖惩记录
     * @return
     * @author guojunji
     */
    @Power(powId = 10)
    @PutMapping("/infoCancelRecord")
    public Result infoCancelRecord(@Validated @RequestBody InfoRecordDto infoRecordDto) {
        return revokeService.infoCancelRecord(infoRecordDto);
    }

      /**
       * 管理员设置成员奖惩记录，支持附件上传
       * @return
       * @author liuyixin
       */
      //TODO 参数名字，需要某一成员
      @PostMapping("/setRevokeInfo")
      public Result setRevokeInfo(@RequestBody RevokeSetDto revokeSetDto, MultipartFile file) throws IOException, ClientException {
          return revokeService.setRevoke(revokeSetDto,file);
      }

      /**
       * 管理员修改成员奖惩记录--与设置奖惩记录一同捆绑
       * @return
       */
      //TODO 参数名字
      @Power(powId = 8)
      @PostMapping("/updateRevokeInfo")
      public Result updateRevokeInfo(@RequestBody RevokeSetDto revokeSetDto) {
          return revokeService.updateRevoke(revokeSetDto);
      }

    /**
     * 管理员查询奖惩类别
     * @return
     */
    @Power(powId = 12)
    @PostMapping("/getRevokeClass")
    public Result getRevokeClass(@Validated @RequestBody RecordClassGetDto recordClassGetDto) {
        return revokeService.obtainRecordClass(recordClassGetDto);
    }

    /**
     * 管理员添加奖惩类别
     * @return
     * @author guojunji
     */
    @Power(powId = 12)
    @PostMapping("/setRevokeClass")
    public Result setRevokeClass(@Validated @RequestBody RecordClassSetDto recordClassSetDto) {
        return revokeService.setRecordClass(recordClassSetDto);
    }

    /**
     * 管理员修改奖惩类别--与添加奖惩类别捆绑
     * @return
     */
    @Power(powId = 12)
    @PutMapping("/updateRevokeClass")
    public Result updateRevokeClass(@Validated @RequestBody RecordClassUpdateDto recordClassUpdateDto) {
        return revokeService.updateRecordClass(recordClassUpdateDto);
    }

    /**
     * 管理员启用和禁用奖惩类型
     * @return
     */
    @Power(powId = 12)
    @DeleteMapping("/banOrRecoverRevokeClass")
    public Result banOrRecoverRevokeClass(@Validated @RequestBody RecordClassBanDto recordClassBanDto) {
        return revokeService.banOrRecoverRevokeClass(recordClassBanDto);
    }

      /**
       * 管理员删除奖惩记录，支持批量删除
       * @return
       * @author liuyixin
       */
      //TODO 参数名字
      @DeleteMapping("/deleteRevokeInfo")
    public Result deleteRevokeInfo(@RequestBody List<Integer> idList) {
          return revokeService.delRevoke(idList);
      }

    /**
     * 管理员删除奖惩类别，但需要重新定义一种奖惩类别给使用该奖惩类别的奖惩记录
     * @return
     * @author guojunji
     */
    //TODO 参数名字
    @Power(powId = 12)
    @PutMapping("/deleteRevokeClass")
    public Result deleteRevokeClass(@Validated @RequestBody RecordClassDelDto recordClassDelDto) {
      return revokeService.updateDelRecordClass(recordClassDelDto);
    }
}
